home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus 2000 #5 / Amiga Plus CD - 2000 - No. 5.iso / Tools / Dev / GameboyDev / GBDK / lib / font.s < prev    next >
Text File  |  1999-04-23  |  7KB  |  574 lines

  1.  
  2.     .include    "global.s"
  3.     ; INCLUDE    "wait_hbl.mh"
  4.     .globl    .cr_curs
  5.     .globl    .adv_curs
  6.     .globl    .cury,.curx
  7.     .globl    .display_off
  8.     sfont_handle_sizeof    =    3
  9.     sfont_handle_font    =    1
  10.     sfont_handle_first_tile    =    0
  11.     FONT_256ENCODING    =    0
  12.     FONT_128ENCODING    =    1
  13.     FONT_NOENCODING    =    2
  14.     FONT_BCOMPRESSED    =    2
  15.     .CR    =  0x0A
  16.     .SPACE    =    0x00
  17.     .MAX_FONTS    =  6
  18.     .area    _HEADER(ABS)
  19.     .org    .MODE_TABLE+4*.T_MODE
  20.     JP    .tmode
  21.     .module    font.ms
  22.     .globl    .fg_colour
  23.     .globl    .bg_colour
  24.     .area    _BSS
  25. font_current::
  26.     .ds    sfont_handle_sizeof
  27. font_first_free_tile::
  28.     .ds    1
  29. font_table::
  30.     .ds    sfont_handle_sizeof*.MAX_FONTS
  31.     .area    _CODE
  32. font_copy_uncompressed::
  33.     ld    a,d
  34.     or    e
  35.     ret    z
  36.     ld    a,h
  37.     cp    #0x98
  38.     jr    c,4$
  39.     sub    #0x98-0x88
  40.     ld    h,a
  41. 4$:
  42.     xor    a
  43.     cp    e
  44.     jr    nz,1$
  45.     dec    d
  46. 1$:
  47.     ldh    a,(.STAT)
  48.     bit    1,a
  49.     jr    nz,#.-4
  50.     ld    a,(bc)
  51.     ld    (hl+),a
  52.     inc    bc
  53.     ldh    a,(.STAT)
  54.     bit    1,a
  55.     jr    nz,#.-4
  56.     ld    a,(bc)
  57.     ld    (hl),a
  58.     inc    bc
  59.     inc    l
  60.     jr    nz,2$
  61.     inc    h
  62.     ld    a,h
  63.     cp    #0x98
  64.     jr    nz,2$
  65.     ld    h,#0x88
  66. 2$:
  67.     dec    e
  68.     jr    nz,1$
  69.     dec    d
  70.     bit    7,d
  71.     jr    z,1$
  72.     ret    
  73. font_copy_compressed::
  74.     ld    a,d
  75.     or    e
  76.     ret    z
  77.     ld    a,h
  78.     cp    #0x98
  79.     jr    c,font_copy_compressed_loop
  80.     sub    #0x98-0x88
  81.     ld    h,a
  82. font_copy_compressed_loop:
  83.     push    de
  84.     ld    a,(bc)
  85.     ld    e,a
  86.     inc    bc
  87.     push    bc
  88.     ld    bc,#0
  89.     ld    a,(.bg_colour)
  90.     bit    0,a
  91.     jr    z,font_copy_compressed_bg_grey1
  92.     ld    b,#0xFF
  93. font_copy_compressed_bg_grey1:
  94.     bit    1,a
  95.     jr    z,font_copy_compressed_bg_grey2
  96.     ld    c,#0xFF
  97. font_copy_compressed_bg_grey2:
  98.     ld    d,a
  99.     ld    a,(.fg_colour)
  100.     xor    d
  101.     ld    d,a
  102.     bit    0,d
  103.     jr    z,font_copy_compressed_grey1
  104.     ld    a,e
  105.     xor    b
  106.     ld    b,a
  107. font_copy_compressed_grey1:
  108.     bit    1,d
  109.     jr    z,font_copy_compressed_grey2
  110.     ld    a,e
  111.     xor    c
  112.     ld    c,a
  113. font_copy_compressed_grey2:
  114.     ldh    a,(.STAT)
  115.     bit    1,a
  116.     jr    nz,#.-4
  117.     ld    (hl),b
  118.     inc    hl
  119.     ldh    a,(.STAT)
  120.     bit    1,a
  121.     jr    nz,#.-4
  122.     ld    (hl),c
  123.     inc    hl
  124.     ld    a,h
  125.     cp    #0x98
  126.     jr    nz,1$
  127.     ld    h,#0x88
  128. 1$:
  129.     pop    bc
  130.     pop    de
  131.     dec    de
  132.     ld    a,d
  133.     or    e
  134.     jr    nz,font_copy_compressed_loop
  135.     ret    
  136. font_load::
  137.     call    .display_off
  138.     push    hl
  139.     ld    hl,#font_table+sfont_handle_font
  140.     ld    b,#.MAX_FONTS
  141. font_load_find_slot:
  142.     ld    a,(hl)    
  143.     inc    hl
  144.     or    (hl)
  145.     cp    #0
  146.     jr    z,font_load_found
  147.     inc    hl
  148.     inc    hl
  149.     dec    b
  150.     jr    nz,font_load_find_slot
  151.     pop    hl
  152.     ld    hl,#0
  153.     jr    font_load_exit
  154. font_load_found:
  155.     pop    de
  156.     ld    (hl),d
  157.     dec    hl
  158.     ld    (hl),e
  159.     ld    a,(font_first_free_tile)
  160.     dec    hl
  161.     ld    (hl),a
  162.     push    hl
  163.     call    font_set
  164.     ld    a,(.mode)
  165.     and    #.T_MODE
  166.     call    nz,font_copy_current
  167.     ld    hl,#font_current+sfont_handle_font
  168.     ld    a,(hl+)
  169.     ld    h,(hl)
  170.     ld    l,a
  171.     inc    hl
  172.     ld    a,(font_first_free_tile)
  173.     add    a,(hl)
  174.     ld    (font_first_free_tile),a
  175.     pop    hl
  176. font_load_exit:
  177.     LDH    A,(.LCDC)
  178.     OR    #0b10000001
  179.     AND    #0b11100111
  180.     LDH    (.LCDC),A
  181.     RET    
  182. font_copy_current::
  183.     ld    hl,#font_current+sfont_handle_font
  184.     ld    a,(hl+)
  185.     ld    h,(hl)
  186.     ld    l,a
  187.     inc    hl
  188.     ld    e,(hl)
  189.     ld    d,#0
  190.     rl    e
  191.     rl    d
  192.     rl    e
  193.     rl    d
  194.     rl    e
  195.     rl    d
  196.     dec    hl
  197.     ld    a,(hl)    
  198.     push    af
  199.     and    #3
  200.     ld    bc,#128
  201.     cp    #FONT_128ENCODING
  202.     jr    z,font_copy_current_copy
  203.     ld    bc,#0
  204.     cp    #FONT_NOENCODING
  205.     jr    z,font_copy_current_copy
  206.     ld    bc,#256
  207. font_copy_current_copy:
  208.     inc    hl
  209.     inc    hl
  210.     add    hl,bc
  211.     ld    c,l
  212.     ld    b,h
  213.     ld    a,(font_current+sfont_handle_first_tile)    
  214.     ld    l,a
  215.     ld    h,#0
  216.     add    hl,hl
  217.     add    hl,hl
  218.     add    hl,hl
  219.     add    hl,hl
  220.     ld    a,#0x90
  221.     add    a,h
  222.     ld    h,a
  223.     pop    af
  224.     bit    FONT_BCOMPRESSED,a
  225.     jp    z,font_copy_uncompressed
  226.     jp    font_copy_compressed
  227. font_set::
  228.     ld    a,(hl+)
  229.     ld    (font_current),a
  230.     ld    a,(hl+)
  231.     ld    (font_current+1),a
  232.     ld    a,(hl+)
  233.     ld    (font_current+2),a
  234.     ret    
  235. .put_char::
  236.     cp    #.CR
  237.     jr    nz,1$
  238.     push    af
  239.     ld    a,(.mode)
  240.     and    #.M_NO_INTERP
  241.     jr    nz,2$
  242.     call    .cr_curs
  243.     pop    af
  244.     ret    
  245. 2$:
  246.     pop    af
  247. 1$:
  248.     CALL    .set_char
  249.     CALL    .adv_curs
  250.     RET    
  251. .out_char::
  252.     CALL    .set_char
  253.     CALL    .adv_curs
  254.     RET    
  255. .del_char::
  256.     CALL    .rew_curs
  257.     LD    A,#.SPACE
  258.     CALL    .set_char
  259.     RET    
  260. .set_char:
  261.     push    af
  262.     ld    a,(font_current+2)
  263.     or    a
  264.     jr    nz,3$
  265.     call    _font_init
  266.     xor    a
  267.     ld    (font_first_free_tile),a
  268.     .globl    _font_ibm_fixed
  269.     ld    hl,#_font_ibm_fixed
  270.     call    font_load
  271. 3$:
  272.     pop    af
  273.     push    bc
  274.     push    de
  275.     push    hl
  276.     ld    e,a
  277.     ld    hl,#font_current+sfont_handle_font
  278.     ld    a,(hl+)
  279.     ld    h,(hl)
  280.     ld    l,a
  281.     ld    a,(hl+)
  282.     and    #3
  283.     cp    #FONT_NOENCODING
  284.     jr    z,set_char_no_encoding
  285.     inc    hl
  286.     ld    d,#0
  287.     add    hl,de
  288.     ld    e,(hl)    
  289. set_char_no_encoding:
  290.     ld    a,(font_current+0)
  291.     add    a,e
  292.     ld    e,a
  293.     LD    A,(.cury) 
  294.     LD    L,A
  295.     LD    H,#0x00
  296.     ADD    HL,HL
  297.     ADD    HL,HL
  298.     ADD    HL,HL
  299.     ADD    HL,HL
  300.     ADD    HL,HL
  301.     LD    A,(.curx) 
  302.     LD    C,A
  303.     LD    B,#0x00
  304.     ADD    HL,BC
  305.     LD    BC,#0x9800
  306.     ADD    HL,BC
  307.     ldh    a,(.STAT)
  308.     bit    1,a
  309.     jr    nz,#.-4
  310.     LD    (HL),E
  311.     POP    HL
  312.     POP    DE
  313.     POP    BC
  314.     RET    
  315. _putchar::
  316.     LDA    HL,2(SP) 
  317.     LD    A,(HL) 
  318.     CALL    .put_char
  319.     RET    
  320. _setchar::
  321.     push    bc
  322.     LDA    HL,4(SP) 
  323.     LD    A,(HL) 
  324.     CALL    .set_char
  325.     pop    bc
  326.     RET    
  327. _font_load::
  328.     push    bc
  329.     LDA    HL,4(SP) 
  330.     LD    A,(HL) 
  331.     inc    hl
  332.     ld    h,(hl)
  333.     ld    l,a
  334.     call    font_load
  335.     push    hl
  336.     pop    de
  337.     pop    bc
  338.     RET    
  339. _font_set::
  340.     push    bc
  341.     LDA    HL,4(SP) 
  342.     LD    A,(HL) 
  343.     inc    hl
  344.     ld    h,(hl)
  345.     ld    l,a
  346.     call    font_set
  347.     pop    bc
  348.     ld    de,#0
  349.     RET    
  350. _font_init::
  351.     push    bc
  352.     .globl    .tmode
  353.     call    .tmode
  354.     ld    a,#1
  355.     ld    (font_first_free_tile),a
  356.     xor    a
  357.     ld    hl,#font_table
  358.     ld    b,#sfont_handle_sizeof*.MAX_FONTS
  359. 1$:
  360.     ld    (hl+),a
  361.     dec    b
  362.     jr    nz,1$
  363.     ld    a,#3
  364.     ld    (.fg_colour),a
  365.     ld    a,#0
  366.     ld    (.bg_colour),a
  367.     call    .cls
  368.     pop    bc
  369.     ret    
  370. _print_repeat::
  371.     push    bc
  372.     lda    hl,4(sp)
  373.     ld    e,(hl)
  374.     inc    hl
  375.     ld    d,(hl)
  376.     xor    a
  377.     cp    d
  378.     jr    nz,_print_repeat_go
  379.     pop    bc
  380.     ret    
  381. _print_repeat_go:
  382.     ld    a,e
  383.     push    de
  384.     call    .put_char
  385.     pop    de
  386.     dec    d
  387.     jr    nz,_print_repeat_go
  388.     pop    bc
  389.     ret    
  390. _gotoxy::
  391.     lda    hl,2(sp)
  392.     ld    a,(hl+)
  393.     ld    (.curx),a
  394.     ld    a,(hl)
  395.     ld    (.cury),a
  396.     ret    
  397. _cls::
  398. .cls::
  399.     PUSH    DE
  400.     PUSH    HL
  401.     LD    HL,#0x9800
  402.     LD    E,#0x20
  403. 1$:
  404.     LD    D,#0x20
  405. 2$:
  406.     ldh    a,(.STAT)
  407.     bit    1,a
  408.     jr    nz,#.-4
  409.     LD    (HL),#.SPACE
  410.     INC    HL
  411.     DEC    D
  412.     JR    NZ,2$
  413.     DEC    E
  414.     JR    NZ,1$
  415.     POP    HL
  416.     POP    DE
  417.     RET    
  418. _posx::
  419.     LD    A,(.mode)
  420.     AND    #.T_MODE
  421.     JR    NZ,1$
  422.     PUSH    BC
  423.     CALL    .tmode
  424.     POP    BC
  425. 1$:
  426.     LD    A,(.curx)
  427.     LD    E,A
  428.     RET    
  429. _posy::
  430.     LD    A,(.mode)
  431.     AND    #.T_MODE
  432.     JR    NZ,1$
  433.     PUSH    BC
  434.     CALL    .tmode
  435.     POP    BC
  436. 1$:
  437.     LD    A,(.cury)
  438.     LD    E,A
  439.     RET    
  440. .rew_curs:
  441.     PUSH    HL
  442.     LD    HL,#.curx
  443.     XOR    A
  444.     CP    (HL)
  445.     JR    Z,1$
  446.     DEC    (HL)
  447.     JR    99$
  448. 1$:
  449.     LD    (HL),#.MAXCURSPOSX
  450.     LD    HL,#.cury
  451.     XOR    A
  452.     CP    (HL)
  453.     JR    Z,99$
  454.     DEC    (HL)
  455. 99$:
  456.     POP    HL
  457.     RET    
  458. .cr_curs::
  459.     PUSH    HL
  460.     XOR    A
  461.     LD    (.curx),A
  462.     LD    HL,#.cury
  463.     LD    A,#.MAXCURSPOSY
  464.     CP    (HL)
  465.     JR    Z,2$
  466.     INC    (HL)
  467.     JR    99$
  468. 2$:
  469.     CALL    .scroll
  470. 99$:
  471.     POP    HL
  472.     RET    
  473. .adv_curs::
  474.     PUSH    HL
  475.     LD    HL,#.curx
  476.     LD    A,#.MAXCURSPOSX
  477.     CP    (HL)
  478.     JR    Z,1$
  479.     INC    (HL)
  480.     JR    99$
  481. 1$:
  482.     LD    (HL),#0x00
  483.     LD    HL,#.cury
  484.     LD    A,#.MAXCURSPOSY
  485.     CP    (HL)
  486.     JR    Z,2$
  487.     INC    (HL)
  488.     JR    99$
  489. 2$:
  490.     LD    A,(.mode)
  491.     AND    #.M_NO_SCROLL
  492.     JR    Z,3$
  493.     XOR    A
  494.     LD    (.cury),A
  495.     LD    (.curx),A
  496.     JR    99$
  497. 3$:
  498.     CALL    .scroll
  499. 99$:
  500.     POP    HL
  501.     RET    
  502. .scroll:
  503.     PUSH    BC
  504.     PUSH    DE
  505.     PUSH    HL
  506.     LD    HL,#0x9800
  507.     LD    BC,#0x9800+0x20
  508.     LD    E,#0x20-0x01
  509. 1$:
  510.     LD    D,#0x20
  511. 2$:
  512.     LDH    A,(.STAT)
  513.     AND    #0x02
  514.     JR    NZ,2$
  515.     LD    A,(BC)
  516.     LD    (HL+),A
  517.     INC    BC
  518.     DEC    D
  519.     JR    NZ,2$
  520.     DEC    E
  521.     JR    NZ,1$
  522.     LD    D,#0x20
  523. 3$:
  524.     LDH    A,(.STAT)
  525.     AND    #0x02
  526.     JR    NZ,3$
  527.     LD    A,#.SPACE
  528.     LD    (HL+),A
  529.     DEC    D
  530.     JR    NZ,3$
  531.     POP    HL
  532.     POP    DE
  533.     POP    BC
  534.     RET    
  535.     .area    _BSS
  536. .curx::
  537.     .ds    0x01
  538. .cury::
  539.     .ds    0x01
  540.     .area    _CODE
  541.     .globl    .vbl
  542.     .globl    .lcd
  543.     .globl    .int_0x40
  544.     .globl    .int_0x48
  545.     .globl    .remove_int
  546. .tmode::
  547.     DI    
  548.     LDH    A,(.LCDC)
  549.     BIT    7,A
  550.     JR    Z,1$
  551.     CALL    .display_off
  552.     LD    BC,#.vbl
  553.     LD    HL,#.int_0x40
  554.     CALL    .remove_int
  555.     LD    BC,#.lcd
  556.     LD    HL,#.int_0x48
  557.     CALL    .remove_int
  558. 1$:
  559.     CALL    .tmode_out
  560.     LDH    A,(.LCDC)
  561.     OR    #0b10000001
  562.     AND    #0b11100111
  563.     LDH    (.LCDC),A
  564.     EI    
  565.     RET    
  566. .tmode_out::
  567.     XOR    A
  568.     LD    (.curx),A
  569.     LD    (.cury),A
  570.     CALL    .cls
  571.     LD    A,#.T_MODE
  572.     LD    (.mode),A
  573.     RET    
  574.